<?php
class TypechoFirewall_Action extends Typecho_Widget implements Widget_Interface_Do
{
    public function execute() {}
    
    public function action()
    {
        // 默认管理页面
        $this->manage();
    }
    
    public function manage()
    {
        // 检查管理员权限
        $user = Typecho_Widget::widget('Widget_User');
        if (!$user->pass('administrator')) {
            throw new Typecho_Exception('无权访问', 403);
        }
        
        // 处理表单提交
        if ($this->request->isPost()) {
            $this->handleForm();
        }
        
        // 显示管理页面
        $this->renderAdminPage();
    }
    
    private function handleForm()
    {
        if ($this->request->get('action') == 'add') {
            $ip = $this->request->get('ip');
            if (filter_var($ip, FILTER_VALIDATE_IP) || $this->isValidWildcardIP($ip)) {
                TypechoFirewall_Plugin::addToBlacklist($ip, '手动添加');
                $this->widget('Widget_Notice')->set(_t('IP %s 已加入黑名单', $ip), 'success');
            }
        } elseif ($this->request->get('action') == 'remove') {
            $ip = $this->request->get('ip');
            TypechoFirewall_Plugin::removeFromBlacklist($ip);
            $this->widget('Widget_Notice')->set(_t('IP %s 已从黑名单移除', $ip), 'success');
        } elseif ($this->request->get('action') == 'add_white') {
            $ip = $this->request->get('ip');
            if (filter_var($ip, FILTER_VALIDATE_IP) || $this->isValidWildcardIP($ip)) {
                TypechoFirewall_Plugin::addToWhitelist($ip, '手动添加');
                $this->widget('Widget_Notice')->set(_t('IP %s 已加入白名单', $ip), 'success');
            }
        }elseif ($this->request->get('action') == 'remove_white') {
            $ip = $this->request->get('ip');
            TypechoFirewall_Plugin::removeFromWhitelist($ip);
            $this->widget('Widget_Notice')->set(_t('IP %s 已从白名单移除', $ip), 'success');
        }
        
        $this->response->goBack();
    }

    /**
 * 验证带通配符的IP格式
 * 例如：192.168.* 或 192.168.5.*
 */
private function isValidWildcardIP($ip) {
    // 去除空格并转小写（兼容性处理）
    $ip = strtolower(trim($ip));
    
    // 基本格式检查
    if (!preg_match('/^(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)$/', $ip)) {
        return false;
    }
    
    // 分割各部分验证
    $segments = explode('.', $ip);
    foreach ($segments as $segment) {
        // 非通配符部分必须为0-255的数字
        if ($segment !== '*' && ($segment < 0 || $segment > 255)) {
            return false;
        }
    }
    
    // 通配符只能出现在后半部分（安全限制）
    $wildcardPos = strpos($ip, '*');
    if ($wildcardPos !== false && $wildcardPos < strrpos($ip, '.')) {
        return false;
    }
    
    return true;
}
    
    private function renderAdminPage()
    {
        // 包含管理页面模板
        include dirname(__FILE__) . '/manage.php';
    }
}



